#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    EnvFile="../common/0_env.sh"
    # shellcheck source=../common/0_env.sh
    source ${EnvFile}
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试 client 普通文件的创建和删除"
echo -e "***********************************************************************"

tmp_dir="/test_createfile"
abs_tmp_dir="${MountPoint}${tmp_dir}"
SysUid=`cat /etc/passwd | grep ${SysUser} | awk -F: '{print $3}'`
SysGid=`cat /etc/passwd | grep ${SysUser} | awk -F: '{print $4}'`

function test_dir_quota()
{
    echo -e "\n------test_dir_quota------"
    limits="--hardnum=1000"
    create_quota ${tmp_dir} ${limits}
    
    filenum=10
    touch_many_file ${abs_tmp_dir} ${filenum}
    # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    sleep 1
    check_usedsize_and_usednum ${tmp_dir}
    
    clean_dir ${abs_tmp_dir}
    # 实际测试发现，创建文件或删除文件后，需要等待一定时间，其父目录的大小才会更新
    sleep 1
    check_usedsize_and_usednum ${tmp_dir}

    remove_quota_dir ${tmp_dir}
}

function test_dir_quota_exceed()
{
    echo -e "\n------test_dir_quota_exceed------"
    limits="--hardnum=10"
    create_quota ${tmp_dir} ${limits}
    
    filenum=11
    
    set +e
    touch_many_file ${abs_tmp_dir} ${filenum}
    set -e
    check_usedsize_and_usednum ${tmp_dir}

    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir}

    remove_quota_dir ${tmp_dir}
}

function test_uid_quota()
{
    echo -e "\n------test_uid_quota------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardnum=1000 --uid=${SysUid}"
    create_quota ${tmp_dir} "${limits}"
    
    filenum=10

    su ${SysUser} <<EOF
        source ${commonFunc}
        touch_many_file ${abs_tmp_dir} ${filenum}
EOF

    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir} --uid=${SysUid}

    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_uid_quota_exceed()
{
    echo -e "\n------test_uid_quota_exceed------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardnum=5 --uid=${SysUid}"
    create_quota ${tmp_dir} "${limits}"
    
    filenum=10

set +e # 下面执行的命令将因超出配额而失败，但是符合预期
    su ${SysUser} <<EOF
        source ${commonFunc}
        touch_many_file ${abs_tmp_dir} ${filenum}
EOF
set -e

    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"

    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir} --uid=${SysUid}

    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_diff_uid_quota()
{
    # 创建的子文件与其父目录的 uid 不一致
    # 可能子文件的 uid 属于配额，则对应配额的 usednum + 1
    # 也可能父目录的 uid属于配额, 则对应配额的 usedsize + 1
    echo -e "\n------test_diff_uid_quota------新建文件的父目录 uid 属于配额, 但子文件 uid 不属于配额"
    test_cmd "mkdir -p ${abs_tmp_dir}/subdir"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardnum=1000 --uid=${SysUid}"
    create_quota ${tmp_dir} "${limits}"
    
    filenum=10
    touch_many_file ${abs_tmp_dir}/subdir ${filenum}
    check_usedsize_and_usednum ${tmp_dir} --uid=${SysUid}
    # unlink
    test_cmd "rm -f ${abs_tmp_dir}/subdir/file0"
    check_usedsize_and_usednum ${tmp_dir} --uid=${SysUid}

    echo -e "\n------test_diff_uid_quota------新建文件的父目录 uid 不属于配额, 但子文件 uid 属于配额"
    clean_dir ${abs_tmp_dir}
    create_quota ${tmp_dir} "${limits}"
    test_cmd "mkdir -p ${abs_tmp_dir}/subdir"
    test_cmd "chmod 0777 ${abs_tmp_dir}/subdir"
    su ${SysUser} <<EOF
        source ${commonFunc}
        touch_many_file ${abs_tmp_dir}/subdir ${filenum}
EOF
    check_usedsize_and_usednum ${tmp_dir} --uid=${SysUid}
    # unlink
    test_cmd "rm -f ${abs_tmp_dir}/subdir/file0"
    check_usedsize_and_usednum ${tmp_dir} --uid=${SysUid}
    
    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir} --uid=${SysUid}
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_gid_quota()
{
    echo -e "\n------test_gid_quota------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardnum=1000 --gid=${SysGid}"
    create_quota ${tmp_dir} "${limits}"
    
    filenum=10

    su ${SysUser} <<EOF
        source ${commonFunc}
        touch_many_file ${abs_tmp_dir} ${filenum}
EOF

    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
}

function test_diff_gid_quota()
{
    # 创建的子文件与其父目录的 gid 不一致
    # 可能子文件的 gid 属于配额，则对应配额的 usednum + 1
    # 也可能父目录的 gid属于配额, 则对应配额的 usedsize + 1
    echo -e "\n------test_diff_gid_quota------新建文件的父目录 gid 属于配额, 但子文件 gid 不属于配额"
    test_cmd "mkdir -p ${abs_tmp_dir}/subdir"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardnum=1000 --gid=${SysGid}"
    create_quota ${tmp_dir} "${limits}"
    
    filenum=10
    touch_many_file ${abs_tmp_dir}/subdir ${filenum}
    check_usedsize_and_usednum ${tmp_dir} --gid=${SysGid}
    # unlink
    test_cmd "rm -f ${abs_tmp_dir}/subdir/file0"
    check_usedsize_and_usednum ${tmp_dir} --gid=${SysGid}

    echo -e "\n------test_diff_gid_quota------新建文件的父目录 gid 不属于配额, 但子文件 gid 属于配额"
    clean_dir ${abs_tmp_dir}
    create_quota ${tmp_dir} "${limits}"
    test_cmd "mkdir -p ${abs_tmp_dir}/subdir"
    test_cmd "chmod 0777 ${abs_tmp_dir}/subdir"
    su ${SysUser} <<EOF
        source ${commonFunc}
        touch_many_file ${abs_tmp_dir}/subdir ${filenum}
EOF
    check_usedsize_and_usednum ${tmp_dir} --gid=${SysGid}
    # unlink
    test_cmd "rm -f ${abs_tmp_dir}/subdir/file0"
    check_usedsize_and_usednum ${tmp_dir} --gid=${SysGid}
    
    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir} --gid=${SysGid}
    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
}

function test_uid_gid_quota()
{
    echo -e "\n------test_uid_gid_quota------"
    chown -R "${SysUid}":"${SysGid}" ${abs_tmp_dir}

    limits="--hardnum=1000 --uid=${SysUid}"
    create_quota ${tmp_dir} "${limits}"

    limits="--hardnum=2000 --gid=${SysGid}"
    create_quota ${tmp_dir} "${limits}"
    
    filenum=10

    su ${SysUser} <<EOF
        source ${commonFunc}
        touch_many_file ${abs_tmp_dir} ${filenum}
EOF

    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    clean_dir ${abs_tmp_dir}
    check_usedsize_and_usednum ${tmp_dir} "--uid=${SysUid}"
    check_usedsize_and_usednum ${tmp_dir} "--gid=${SysGid}"

    remove_quota_dir ${tmp_dir} "--gid=${SysGid}"
    remove_quota_dir ${tmp_dir} "--uid=${SysUid}"
}

function test_no_quota()
{
    echo -e "\n------测试没有配额时创建和删除文件------"
    filenum=10
    touch_many_file ${abs_tmp_dir} ${filenum}
    clean_dir ${abs_tmp_dir}
}

mkdir -p ${abs_tmp_dir}
clean_dir ${abs_tmp_dir}
orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
chown -R root:root ${abs_tmp_dir}
remove_all_quota_for_dir ${tmp_dir}

test_no_quota  # 测试没有配额时创建和删除文件

test_dir_quota # 测试创建目录配额后创建和删除文件
test_dir_quota_exceed

test_uid_quota
test_uid_quota_exceed
test_diff_uid_quota

test_gid_quota
#TODO:test_gid_quota_exceed
test_diff_gid_quota

test_uid_gid_quota

rm_abs_dir ${abs_tmp_dir}